package TXPathFinder;

import com.sun.j3d.utils.geometry.Sphere;
import java.util.ArrayList;
import java.util.Hashtable;
import javax.media.j3d.Appearance;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Material;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.media.j3d.TransformGroup;
import javax.vecmath.Color3f;
import javax.vecmath.Vector3f;

/**
*       \class	Avatar
*	\brief	La classe qui représente un avatar
**/
public class Avatar
{
    private float rayon;
    private Integer ident;
    private boolean isSelected;
    private BranchGroup BGavatar;
    private Sphere sphere;
    private TransformGroup objTrans;
    private Color3f colorAvatar;
    protected float xPos;
    protected float yPos;
    private Hashtable<String,Shape3D> shapeSight;
    private ArrayList<String> path;
    private String gotoShape;
    
    /**
    *	\brief	Constructeur
    *   \param color La couleur de l'avatar
    *   \param r Le rayon de l'avatar
    *   \param X la position X de l'avatar
    *   \param Y la position Y de l'avatar
    *   \param id L'identifiant de l'avatar
    **/
    public Avatar(Color3f color, float r, float X, float Y, int id)
    {
        rayon = r;
        colorAvatar = color;
        xPos = X;
        yPos = Y;
        ident = id;
        isSelected = false;
        CreateAvatar();

    }

    /**
    *	\brief	Accesseur
    *   \return Vrai si l'avatar est selectionné par l'utilisateur, faux sinon
    **/
    public boolean isIsSelected() {
        return isSelected;
    }

    /**
    *	\brief	Accesseur
    *   \param isSelected Vrai si l'avatar est selectionné par l'utilisateur, faux sinon
    **/
    public void setIsSelected(boolean isSelected) {
        this.isSelected = isSelected;
    }

    /**
    *	\brief	Accesseur
    *   \return La branche de l'univers associé à l'avatar
    **/
    public BranchGroup getBG()
    {
        return BGavatar;
    }

    /**
    *	\brief	Accesseur
    *   \return Le rayon de l'avatar
    **/
    public float getRayon()
    {
        return rayon;
    }

    /**
    *	\brief	Crée l'avatar avec la bonne couleur et taille et le place dans une branche pour le viewer3D à la bonne position
    **/
    private void CreateAvatar()
    {
         BGavatar = new BranchGroup();
         BGavatar.setCapability(BranchGroup.ALLOW_DETACH);

         shapeSight = new Hashtable<String,Shape3D>();
         path = new ArrayList<String>();

         //creer la sphere
         sphere = new Sphere(rayon, 1, 40);
         //couleur de la sphere
         Appearance app=new Appearance();
         app.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_READ);
         app.setCapability(Appearance.ALLOW_COLORING_ATTRIBUTES_WRITE);
         Material mat = new Material();
         mat.setDiffuseColor (colorAvatar);
         app.setMaterial (mat);

         Shape3D shape= new Shape3D(sphere.getShape().getGeometry(),app);
         shape.setCapability(shape.ALLOW_APPEARANCE_READ);
         shape.setCapability(shape.ALLOW_APPEARANCE_WRITE);
         shape.setName(ident.toString());

         objTrans = new TransformGroup();
         objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
         Transform3D pos1 = new Transform3D();
         pos1.setTranslation(new Vector3f(xPos,yPos,0.5f));
         objTrans.setTransform(pos1);
         objTrans.addChild(shape);

         BGavatar.addChild(objTrans);

         PickHighlightAvatar pickBehAvatar = new PickHighlightAvatar(DataModel.getInstance().getViewer().getjCanvas3D(), BGavatar);
    }

    /**
    *	\brief	Accesseur
    *   \return La destination de l'avatar
    **/
    public String getGotoShape() {
        return gotoShape;
    }

    /**
    *	\brief	Accesseur
    *   \return Le chemin parcourut par l'avatar
    **/
    public ArrayList<String> getPath() {
        return path;
    }

    /**
    *	\brief	Accesseur
    *   \return La vision de l'avatar dans la carte
    **/
    public Hashtable<String, Shape3D> getShapeSight() {
        return shapeSight;
    }

    /**
    *	\brief	Accesseur
    *   \return La position Y de l'avatar
    **/
    public float getY()
    {
            return yPos;
    }

    /**
    *	\brief	Accesseur
    *   \return La position X de l'avatar
    **/
    public float getX()
    {
            return xPos;
    }

    /**
    *	\brief	Accesseur
    *   \param x La position X de l'avatar
    **/
    public void setX(float x)
    {
            xPos = x;
    }

    /**
    *	\brief	Accesseur
    *   \param y La position Y de l'avatar
    **/
    public void setY(float y)
    {
            yPos = y;
    }

    /**
    *	\brief	Accesseur
    *   \return La transformation de l'avatar qui permet de lui définir une nouvelle position
    **/
    public TransformGroup getTransform()
    {
        return objTrans;
    }

}
